/*
 * CrudAgenciaPresenter
 * 
 * Versão 1.0
 * 
 * Data de criação: 27/05/2013
 * 
 * Copyright (c)
 * Autor: Odair José Tanes
 * Matrícula: 2009209186
 * Disciplina: Projeto de Sistemas de Software
 * 
 * Protótipo criado para exercício da disciplina
 * 
 * 
 * 
 *______________________________________________________________________________
 * Correções a serem feitas:
 * 
 *  1 - O Cliente obrigatório passado em addListenerBtnSalvar ainda está null
 *  2 - Atualizar tabela de listagem de agências usando Observer
 * 
 * 
 * 
 */
package edu.ufes.pss.exercicioSwingBanco.presenter;

import edu.ufes.pss.exercicioSwingBanco.view.CrudAgenciaView;
import edu.ufes.pss.exercicioSwingBanco.model.Agencia;
import edu.ufes.pss.exercicioSwingBanco.interfaces.DaoInterface;
import edu.ufes.pss.exercicioSwingBanco.factory.DaoAgenciaFactory;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/**
 *
 * @author OdairJT
 */
public class CrudAgenciaPresenter {

    private CrudAgenciaView view;

    public CrudAgenciaPresenter() {
        this.view = new CrudAgenciaView();

        addListenerBtnSalvar();
        addListenerBtnEditar();
        addListenerBtnExcluir();
        addListenerBtnFechar();

        this.view.setLocationRelativeTo(null);
        this.view.getTxtCodigo().grabFocus();
        this.view.setVisible(true);
    }

    public CrudAgenciaPresenter(String pCodigo) {
        this.view = new CrudAgenciaView();

        addListenerBtnSalvar();
        addListenerBtnEditar();
        addListenerBtnExcluir();
        addListenerBtnFechar();

        DaoInterface p = DaoAgenciaFactory.CriarDaoAgencia(1);
        Agencia a = (Agencia) p.buscarObjeto(pCodigo);

        this.view.getTxtCodigo().setText(a.getCodigo());
        this.view.getTxtCidade().setText(a.getCidade());
        this.view.getCmbEstado().setSelectedItem(a.getUf());

        this.view.getTxtCodigo().setEnabled(false);
        this.view.getTxtCidade().setEnabled(false);
        this.view.getCmbEstado().setEnabled(false);
        this.view.getBtnSalvar().setEnabled(false);
        this.view.getBtnEditar().setEnabled(true);
        this.view.getBtnExcluir().setEnabled(true);

        this.view.setLocationRelativeTo(null);
        this.view.getTxtCodigo().grabFocus();
        this.view.setVisible(true);
    }

    private void addListenerBtnSalvar() {
        this.view.getBtnSalvar().addActionListener(
                new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                actionPerformedBtnSalvar();
            }
        });
    }

    private void actionPerformedBtnSalvar() {
        if (validaDados()) {

            /* O padrão factory retorna a instância de acordo com a forma 
             * de persistencia selecionada
             */

            DaoInterface p = DaoAgenciaFactory.CriarDaoAgencia(1);

            Agencia agencia;

            /* Modificar a passagem de Cliente aqui */
            agencia = new Agencia(
                    view.getTxtCodigo().getText(),
                    view.getTxtCidade().getText(),
                    view.getCmbEstado().getSelectedItem().toString(),
                    null);

            if (p.salvarOuAtualizar(agencia)) {
                /* Atualziar listagem via Observer */                
                ListaAgenciaPresenter listaAgenciaPresenter = new ListaAgenciaPresenter();                
                this.view.dispose();
            }

        } else {
            this.view.showMessage("Dados inválidos!");
        }
    }

    private boolean validaDados() {

        boolean retorno = true;

        if (this.view.getTxtCodigo().getText().isEmpty()
                || this.view.getTxtCidade().getText().isEmpty()
                || this.view.getCmbEstado().getSelectedItem() == null) {

            retorno = false;

        }

        return retorno;

    }

    private void addListenerBtnEditar() {
        this.view.getBtnEditar().addActionListener(
                new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                actionPerformedBtnEditar();
            }
        });
    }

    private void actionPerformedBtnEditar() {
        this.view.getTxtCidade().setEnabled(true);
        this.view.getCmbEstado().setEnabled(true);
        this.view.getBtnSalvar().setEnabled(true);
        this.view.getBtnEditar().setEnabled(false);
        this.view.getBtnExcluir().setEnabled(false);
    }

    private void addListenerBtnExcluir() {
        this.view.getBtnExcluir().addActionListener(
                new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                actionPerformedBtnExcluir();
            }
        });
    }

    private void actionPerformedBtnExcluir() {
        /* O padrão factory retorna a instância de acordo com a forma 
         * de persistencia selecionada
         */

        DaoInterface daoAgencia = DaoAgenciaFactory.CriarDaoAgencia(1);

        String codigo = this.view.getTxtCodigo().getText();

        Agencia tempAgencia = (Agencia) daoAgencia.buscarObjeto(codigo);

        if (this.view.showConfirmMessage("Verificação de ação", "Excluir?") == 0) {
            if (daoAgencia.excluir(tempAgencia)) {
                ListaAgenciaPresenter listaAgenciaPresenter = new ListaAgenciaPresenter();
                this.view.dispose();
            }
        }
    }

    private void addListenerBtnFechar() {
        this.view.getBtnFechar().addActionListener(
                new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                actionPerformedBtnFechar();
            }
        });
    }

    private void actionPerformedBtnFechar() {
        ListaAgenciaPresenter listaAgenciaPresenter = new ListaAgenciaPresenter();
        this.view.dispose();
    }
}
